all repos — caroster @ 6d2659c5a5d3df7aeeaad568e6543fcbb943bf45

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/index.tsx (view raw)

  1import {useState, useReducer, PropsWithChildren, useMemo} from 'react';
  2import {makeStyles} from '@material-ui/core/styles';
  3import {useTranslation} from 'react-i18next';
  4import EventLayout, {TabComponent} from '../../../layouts/Event';
  5import TravelColumns from '../../../containers/TravelColumns';
  6import NewTravelDialog from '../../../containers/NewTravelDialog';
  7import VehicleChoiceDialog from '../../../containers/VehicleChoiceDialog';
  8import {
  9  EventByUuidDocument,
 10  useFindUserVehiclesLazyQuery,
 11} from '../../../generated/graphql';
 12import useProfile from '../../../hooks/useProfile';
 13import Fab from '../../../containers/Fab';
 14import {
 15  initializeApollo,
 16  APOLLO_STATE_PROP_NAME,
 17} from '../../../lib/apolloClient';
 18
 19interface Props {
 20  eventUUID: string;
 21}
 22
 23const Page = (props: PropsWithChildren<Props>) => {
 24  return <EventLayout {...props} Tab={TravelsTab} />;
 25};
 26
 27const TravelsTab: TabComponent = (props: {event}) => {
 28  const classes = useStyles();
 29  const {t} = useTranslation();
 30  const {user} = useProfile();
 31  const [findUserVehicle, {data}] = useFindUserVehiclesLazyQuery();
 32  const vehicles = data?.me?.profile?.vehicles?.data || [];
 33  const [openNewTravelContext, toggleNewTravel] = useState({opened: false});
 34  const [openVehicleChoice, toggleVehicleChoice] = useReducer(i => !i, false);
 35
 36  useMemo(() => {
 37    if (user) findUserVehicle();
 38  }, [user]);
 39
 40  const addTravelClickHandler =
 41    user && vehicles?.length != 0
 42      ? toggleVehicleChoice
 43      : () => toggleNewTravel({opened: true});
 44
 45  return (
 46    <>
 47      <TravelColumns toggle={addTravelClickHandler} />
 48      <Fab
 49        onClick={addTravelClickHandler}
 50        aria-label="add-car"
 51        color="primary"
 52        className={classes.bottomRight}
 53      >
 54        {t('travel.creation.title')}
 55      </Fab>
 56      <NewTravelDialog
 57        context={openNewTravelContext}
 58        toggle={() => toggleNewTravel({opened: false})}
 59      />
 60      <VehicleChoiceDialog
 61        open={openVehicleChoice}
 62        toggle={toggleVehicleChoice}
 63        toggleNewTravel={toggleNewTravel}
 64        vehicles={vehicles}
 65      />
 66    </>
 67  );
 68};
 69
 70const useStyles = makeStyles(theme => ({
 71  bottomRight: {
 72    bottom: 0,
 73    right: theme.spacing(6),
 74
 75    [theme.breakpoints.down('sm')]: {
 76      right: theme.spacing(1),
 77      bottom: 56,
 78    },
 79  },
 80}));
 81
 82export async function getServerSideProps(ctx) {
 83  const {uuid} = ctx.query;
 84  const {host = ''} = ctx.req.headers;
 85
 86  const apolloClient = initializeApollo();
 87  const {data: {eventByUUID: {data: event = null} = {}} = {}} =
 88    await apolloClient.query({
 89      query: EventByUuidDocument,
 90      variables: {uuid},
 91    });
 92
 93  try {
 94    return {
 95      props: {
 96        [APOLLO_STATE_PROP_NAME]: apolloClient.cache.extract(),
 97        eventUUID: uuid,
 98        metas: {
 99          title: event?.name || '',
100          url: `https://${host}${ctx.resolvedUrl}`,
101        },
102      },
103    };
104  } catch (error) {
105    console.error(error);
106    return {props: {}};
107  }
108}
109
110export default Page;